<?php

namespace Acme\UserBundle\Listener;

use Symfony\Component\Security\Http\Firewall\UsernamePasswordFormAuthenticationListener as BaseListener;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface;
use Symfony\Component\HttpFoundation\Request;
use Psr\Log\LoggerInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Http\Session\SessionAuthenticationStrategyInterface;
use Symfony\Component\Security\Http\HttpUtils;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

// use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface;
// use Symfony\Component\HttpFoundation\Request;
// use Symfony\Component\HttpKernel\Log\LoggerInterface;
// use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
// use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
// use Symfony\Component\Security\Http\Session\SessionAuthenticationStrategyInterface;
// use Symfony\Component\Security\Http\HttpUtils;
// use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
// use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
// use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
// use Symfony\Component\Security\Core\SecurityContextInterface;
// use Symfony\Component\EventDispatcher\EventDispatcherInterface;
// use Symfony\Component\Security\Core\Exception\BadCredentialsException;
class LoginFormListener extends BaseListener {
	public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager, SessionAuthenticationStrategyInterface $sessionStrategy, HttpUtils $httpUtils, $providerKey, AuthenticationSuccessHandlerInterface $successHandler, AuthenticationFailureHandlerInterface $failureHandler, array $options = array(), LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null, CsrfProviderInterface $csrfProvider = null) {
		parent::__construct ( $securityContext, $authenticationManager, $sessionStrategy, $httpUtils, $providerKey, $successHandler, $failureHandler, array_merge ( array (
				'username_parameter' => '_username',
				'password_parameter' => '_password',
				'target' => 'target',
				'csrf_parameter' => '_csrf_token',
				'intention' => 'authenticate',
				'post_only' => true 
		), $options ), $logger, $dispatcher );
		
		$this->csrfProvider = $csrfProvider;
	}
	
	/**
	 *
	 * @ERROR!!!
	 *
	 */
	protected function attemptAuthentication(Request $request) {
		if (null !== $this->csrfProvider) {
			$csrfToken = $request->get ( $this->options ['csrf_parameter'], null, true );
			
			if (false === $this->csrfProvider->isCsrfTokenValid ( $this->options ['intention'], $csrfToken )) {
				throw new InvalidCsrfTokenException ( 'Invalid CSRF token.' );
			}
		}
		
		if ($this->options ['post_only']) {
			$username = trim ( $request->request->get ( $this->options ['username_parameter'], null, true ) );
			$password = $request->request->get ( $this->options ['password_parameter'], null, true );
		} else {
			$username = trim ( $request->get ( $this->options ['username_parameter'], null, true ) );
			$password = $request->get ( $this->options ['password_parameter'], null, true );
		}
		
		$request->getSession ()->set ( SecurityContextInterface::LAST_USERNAME, $username );
		$request->getSession ()->set ( 'target', trim ( $request->request->get ( $this->options ['target'], null, true ) ) );
		
		return $this->authenticationManager->authenticate ( new UsernamePasswordToken ( $username, $password, $this->providerKey ) );
	}
}